home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / earcd / phase5 / lha-ppc / src / util.c < prev    next >
C/C++ Source or Header  |  1997-12-04  |  4KB  |  172 lines

  1. /*
  2.  * util.c - part of LHa for UNIX
  3.  *    Feb 26 1992 modified by Masaru Oki
  4.  *    Mar  4 1992 modified by Masaru Oki
  5.  *        #ifndef USESTRCASECMP added.
  6.  *    Mar 31 1992 modified by Masaru Oki
  7.  *        #ifdef NOMEMSET added.
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <errno.h>
  12. #include <stdlib.h>
  13. #include "lharc.h"
  14.  
  15. #define BUFFERSIZE 2048
  16.  
  17. extern unsigned short crc;
  18. extern int quiet;
  19.  
  20. /* crc_flag == 0: no crc, 1: crc check, 2: extract, 3: append */
  21. /* return: size of source file */
  22. long copyfile(FILE *f1, FILE *f2, long size, int crc_flg)
  23. {
  24.     unsigned short xsize;
  25.     char *buf;
  26.     long rsize = 0;
  27.  
  28.     if ((buf = (char *)malloc(BUFFERSIZE)) == NULL)
  29.         fatal_error("virtual memory exhausted.\n");
  30.     crc = 0;
  31.     if ((crc_flg == 2 || crc_flg) && text_mode)
  32.         init_code_cache();
  33.     while (size > 0)
  34.     {
  35.         /* read */
  36.         if (crc_flg == 3 && text_mode)
  37.     {
  38.             xsize = fread_txt(buf, BUFFERSIZE, f1);
  39.             if (xsize == 0)
  40.                 break;
  41.             if (ferror(f1))
  42.         {
  43.                 fatal_error("file read error\n");
  44.             }
  45.         }
  46.         else
  47.     {
  48.             xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
  49.             if (fread(buf, 1, xsize, f1) != xsize)
  50.         {
  51.                 fatal_error("file read error\n");
  52.             }
  53.         }
  54.         /* write */
  55.         if (f2)
  56.     {
  57.             if (crc_flg == 2 && text_mode)
  58.         {
  59.                 if (fwrite_txt(buf, xsize, f2))
  60.         {
  61.                     fatal_error("file write error\n");
  62.                 }
  63.             }
  64.             else
  65.         {
  66.                 if (fwrite(buf, 1, xsize, f2) != xsize)
  67.         {
  68.                     fatal_error("file write error\n");
  69.                 }
  70.             }
  71.         }
  72.         /* calculate crc */
  73.         if (crc_flg)
  74.     {
  75.             calccrc(buf, xsize);
  76.         }
  77.         rsize += xsize;
  78.         if (crc_flg != 3 || !text_mode)
  79.             size -= xsize;
  80.     }
  81.     free(buf);
  82.     return rsize;
  83. }
  84.  
  85. int encode_stored_crc(FILE *ifp, FILE *ofp, long size,
  86.               long *original_size_var, long *write_size_var)
  87. {
  88.     int save_quiet;
  89.  
  90.     save_quiet = quiet;
  91.     quiet = 1;
  92.     size = copyfile (ifp,ofp,size,3);
  93.     *original_size_var = *write_size_var = size;
  94.     quiet = save_quiet;
  95.     return crc;
  96. }
  97.  
  98. /***************************************
  99.     convert path delimiter
  100. ****************************************
  101.     returns *filename
  102. ***************************************/
  103. unsigned char *convdelim(unsigned char *path, unsigned char delim)
  104. {
  105.     unsigned char c;
  106.     unsigned char *p;
  107. #ifdef MULTIBYTE_CHAR
  108.     int kflg;
  109.  
  110.     kflg = 0;
  111. #endif
  112.     for (p = path; (c = *p) != 0; p++)
  113.     {
  114. #ifdef MULTIBYTE_CHAR
  115.         if (kflg)
  116.         {
  117.             kflg = 0;
  118.         }
  119.         else if (iskanji(c))
  120.         {
  121.             kflg = 1;
  122.         }
  123.         else
  124. #endif
  125.         if (c == '\\' || c == DELIM || c == DELIM2)
  126.         {
  127.             *p = delim;
  128.             path = p + 1;
  129.         }
  130.     }
  131.     return path;
  132. }
  133.  
  134. /* If TRUE, archive file name is msdos SFX file name. */
  135. boolean archive_is_msdos_sfx1(char *name)
  136. {
  137.     int len = strlen (name);
  138.  
  139.     return ((len >= 4) &&
  140.             (stricmp (".COM",name + len - 4) == 0 ||
  141.             stricmp (".EXE",name + len - 4) == 0)) ||
  142.             ((len >= 2) &&
  143.             (stricmp (".x",name + len - 2) == 0));
  144. }
  145.  
  146. /* skip SFX header */
  147. boolean skip_msdos_sfx1_code(FILE *fp)
  148. {
  149.     unsigned char buffer[4096];
  150.     unsigned char *p, *q;
  151.     int n;
  152.  
  153.     n = fread (buffer, sizeof (char), 4096, fp);
  154.  
  155.     for (p = buffer + 2, q = buffer + n - 5; p < q; p ++)
  156.     {
  157.         /* found "-l??-" keyword (as METHOD type string) */
  158.         if (p[0] == '-' && p[1] == 'l' && p[4] == '-')
  159.         {
  160.             /* size and checksum validate check */
  161.             if (p[-2] > 20 && p[-1] == calc_sum (p, p[-2]))
  162.             {
  163.                 fseek (fp, ((p - 2) - buffer) - n, SEEK_CUR);
  164.                 return TRUE;
  165.             }
  166.         }
  167.     }
  168.  
  169.     fseek (fp, -n, SEEK_CUR);
  170.     return FALSE;
  171. }
  172.